#ifndef WT_ELECTRICAL_MODEL_H
#define WT_ELECTRICAL_MODEL_H


#include "header/model/wtg_models/wtg_model.h"
#include <complex>
class WT_ELECTRICAL_MODEL : public WTG_MODEL
{
    public:
        WT_ELECTRICAL_MODEL(STEPS& toolkit);
        virtual ~WT_ELECTRICAL_MODEL();

        void unbypass_model();
        void bypass_model();
        bool is_model_bypassed() const;
    public:
        virtual string get_model_type() const;

        complex<double> get_wt_generator_terminal_generation_in_MVA() const;
        complex<double> get_wt_generator_terminal_generation_in_pu_based_on_mbase() const;
        complex<double> get_wt_generator_terminal_complex_current_in_pu() const;
        double get_wt_generator_terminal_current_in_pu() const;


        double get_wt_generator_speed_in_pu() const;
        double get_wt_generator_speed_reference_in_pu() const;

    public:
        virtual string get_model_name() const = 0;

        virtual bool setup_model_with_steps_string_vector(vector<string>& data) = 0;
        virtual bool setup_model_with_psse_string(string data) = 0;
        virtual bool setup_model_with_bpa_string(string data) = 0;

        virtual void setup_block_toolkit_and_parameters() = 0;

        virtual void initialize() = 0;
        virtual void run(DYNAMIC_MODE mode) = 0;
        virtual double get_active_current_command_in_pu_based_on_mbase() = 0;
        virtual double get_active_power_command_in_pu_based_on_mbase() const = 0;
        virtual double get_reactive_current_command_in_pu_based_on_mbase() = 0;
        virtual double get_reactive_power_command_in_pu_based_on_mbase() = 0;
        virtual double get_reactive_voltage_command_in_pu() const = 0;
        virtual void check() = 0;
        virtual void clear() = 0;
        virtual void report() = 0;
        virtual void save() = 0;
        virtual string get_standard_psse_string(bool export_internal_bus_number=false) const = 0;

        virtual void prepare_model_data_table() = 0;
        virtual double get_model_data_with_name(string par_name) const = 0;
        virtual void set_model_data_with_name(string par_name, double value) = 0;
        virtual double get_minimum_nonzero_time_constant_in_s() = 0;

        virtual void prepare_model_internal_variable_table() = 0;
        virtual double get_model_internal_variable_with_name(string var_name)= 0;

        virtual string get_dynamic_data_in_psse_format() const = 0;
        virtual string get_dynamic_data_in_bpa_format() const = 0;
        virtual string get_dynamic_data_in_steps_format() const = 0;
    private:
        bool flag_model_bypassed;
};

#endif // WT_ELECTRICAL_MODEL_H
